package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.Page2Vo;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.LoginUser;
import com.boil.qz.safekavass.pojo.UserRoleVo;
import com.boil.qz.safekavass.service.LoginUserService;
import com.boil.qz.safekavass.service.PermissionService;
import com.boil.qz.safekavass.web.request.param.IdParam;
import com.boil.qz.safekavass.web.request.param.PermissionListParam;
import com.boil.qz.safekavass.web.request.param.PermissionUpdateParam;
import com.boil.util.Constants;
import com.boil.util.OkBaseController;
import com.boil.util.Page2;
import com.boil.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;

/**
 * Created by ChenYong on 2017-08-09.
 * <br>
 * 权限 Controller。
 */
@Controller
@RequestMapping("/web/permission")
public class PermissionController extends OkBaseController {
    /**
     * 注入用户 Service
     */
    @Autowired
    private LoginUserService loginUserService;
    /**
     * 注入权限 Service
     */
    @Autowired
    private PermissionService permissionService;

    /**
     * 权限列表页面。
     *
     * @param model 模型
     * @return 权限列表页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.html")
    public String listHtml(Model model) {
        return "/permission/list";
    }

    /**
     * 获取权限列表 json。
     *
     * @param model  模型
     * @param param  权限列表的请求参数
     * @param errors 请求参数的校验结果
     * @return 权限列表 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.json")
    @ResponseBody
    public ResultVo listJson(Model model, @Valid PermissionListParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        // 查询分页实例
        Page2<UserRoleVo> page2 = Utils.getPage2(request, param, Constants.ID_STR);
        page2.getParams().put("loginid", param.getLoginid());
        page2.getParams().put("loginName", param.getLoginName());
        page2.getParams().put("permissionStatus", param.getPermissionStatus());

        // 分页查询
        permissionService.findInPage(page2);

        // 获取 DataTables 专用分页映射实例
        Page2Vo<UserRoleVo> page2Vo = Utils.getPage2Vo(param, page2);

        resultVo.setResult(page2Vo);

        return resultVo;
    }

    /**
     * 分配权限页面。
     *
     * @param model  模型
     * @param param  ID 请求参数
     * @param errors 请求参数的校验结果
     * @return 分配权限页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/update.html")
    public String listHtml(Model model, @Valid IdParam param, BindingResult errors) {
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        // 查询用户
        LoginUser loginUser = loginUserService.findOne(param.getId());

        resultVo.setResult(loginUser);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/permission/update";
    }

    /**
     * 获取用户已拥有或未拥有的角色 json。
     *
     * @param model  模型
     * @param param  ID 请求参数
     * @param errors 请求参数的校验结果
     * @return 用户已拥有或未拥有的角色 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/role.json")
    @ResponseBody
    public ResultVo roleJson(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        permissionService.findRoleVo(resultVo, param.getId());

        return resultVo;
    }

    /**
     * 分配权限。
     *
     * @param model  模型
     * @param param  分配权限的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到权限列表页面--->“redirect:/permission/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/update.html")
    public String update(Model model, @Valid PermissionUpdateParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        permissionService.doPermission(param);

        return "redirect:/web/permission/list.html";
    }
}